package com.kotlin.flong.coroutines

import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

/**
 * @Author:liangjl
 * @Date: 2020/7/7-20:08
 * @Eamil:jilongliang@sina.com
 * @Description:
 * 关于async的延迟执行
 * 我们可以通过将async方法的start参数设置为CoroutineStart.LAZY来实现协程的延迟执行
 * 在这种情况下，协程会在两种场景下去执行，调用Deferred的await方法，或是调用Job的start方法
 *
 */
fun main() = runBlocking {
    var measure = measureTimeMillis {

        var value1 = async(start = CoroutineStart.LAZY) { intValue1() }
        var value2 = async(start = CoroutineStart.LAZY) { intValue2() }

        println("Hello World")

        Thread.sleep(6000)

        //启动协程,尝试注释掉这两个start会变慢，并不是异步，调用位置执行也会变快，value1是2秒，value2是3秒
        value1.start()
        value2.start()


        var result1 = value1.await()
        var result2 = value2.await()


        println("$result1+$result2=${result1 + result2}")

    }

    println("总耗时：$measure")

}

private suspend fun intValue1(): Int {
    delay(2000)
    return 15
}

private suspend fun intValue2(): Int {
    delay(3000)
    return 20
}